﻿/*
 * Responsabilidade:
 * Cada classe derivada é responsavel para uma categoria de operação, em qual
 * o usuário atua no dispositivo externo ligado pela porta serial. Ele gerencia o
 * estado desta operação.
 * Cada classe derivada utiliza um painel no formulário principal para interagir com 
 * o usuário.
 * Cada classe derivada utiliza a porta serial para se comunicar com o dispositivo externo. Ela
 * é responsavel para fazer as configurações do UART da porta serial, assinar para
 * os eventos da porta serial e ecerrar o assinar no final.
 * Métodos do ControladorOperação e das classes derivadas não passam exceptions.
 * 
 * Lugar na arquitetura:
 * O controlador da sessão instancia um objeto da cada classe derivada. Este objeto 
 * recebe como parâmetro do construtor o painel correspondente.
 * Os paineis executam no thread principal, partes destes controladores em outros - 
 * então precisam de Invoke() para atualizar os controles no painel.
 * 
 */
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Windows.Forms;

namespace J_Controle
{

    public class ControladorDialogo
    {
        protected Panel PainelAtual;
        protected SerialPort PortaAtual;
        protected ConfigHW CnfAtual;

        protected SerialErrorReceivedEventHandler hanErroAtual; // lembrar para operador -=
        protected SerialDataReceivedEventHandler hanDadosAtual;
        protected SerialPinChangedEventHandler hanPinoAtual;


        // ======================================
        //
        // Constructor

        public ControladorDialogo(Panel prmPanel)
        {
            PainelAtual = prmPanel;
        }

        // =======================================
        //
        // Metodos definindo o interface commum das classes derivadas

        public virtual bool Conectar(SerialPort prmPorta, ConfigHW prmConfig)
        {
            PortaAtual = prmPorta;
            CnfAtual = prmConfig;
            return true;
        }
        public virtual bool Desconectar()
        {
            return false;
        }
        public virtual void Visualizar()
        {
            // mostrar painel associado em frente
            PainelAtual.Dock = System.Windows.Forms.DockStyle.Fill;
            PainelAtual.BringToFront();
            PainelAtual.Show();
            PainelAtual.Refresh();
        }
    }
}
